package com.arch.dev.server.pdf;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.arch.dev.client.vo.BudgetVO;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class FirstPdf {

	/** Inner class to add a header and a footer. */

	static class HeaderFooter extends PdfPageEventHelper {

		public void onEndPage(PdfWriter writer, Document document) {

			Rectangle rect = writer.getBoxSize("art");

			ColumnText
					.showTextAligned(
							writer.getDirectContent(),

							Element.ALIGN_CENTER,
							new Phrase(String.format("page %d",
									writer.getPageNumber())),

							(rect.getLeft() + rect.getRight()) / 2,
							rect.getBottom() - 18, 0);

		}

	}

	private static String FILE = "d:/FirstPdf.pdf";

	private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18,

	Font.BOLD);

	private static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12,

	Font.NORMAL, BaseColor.RED);

	private static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16,

	Font.BOLD);

	private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12,

	Font.BOLD);

	private java.util.List<BudgetVO> budgetVOs;

	public static void main(String[] args) {

		try {

			Document document = new Document();

			PdfWriter writer = PdfWriter.getInstance(document,
					new FileOutputStream(FILE));

			document.open();

			addMetaData(document);

			addTitlePage(document);

			// addContent(document);

			document.close();

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

	static PdfWriter writer;

	public void generatePDF(File file, String imageLocation,
			java.util.List<BudgetVO> budgetVOs) {

		this.absoluteDiskPath = imageLocation;

		this.budgetVOs = budgetVOs;

		try {

			Document document = new Document();

			writer = PdfWriter
					.getInstance(document, new FileOutputStream(file));

			addFooter();

			document.open();

			addMetaData(document);

			addTitlePage(document);

			addContent(document);

			document.close();

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

	// iText allows to add metadata to the PDF which can be viewed in your Adobe

	// Reader

	// under File -> Properties

	private static void addMetaData(Document document) {

		document.addTitle("Expenditure Doc");

		document.addSubject("Using iText");

		document.addKeywords("Java, PDF, iText");

		document.addAuthor("Expense Calculator");

		document.addCreator("Expense Calculator");

	}

	private static void addFooter() {

		writer.setBoxSize("art", new Rectangle(36, 54, 559, 788));

		HeaderFooter event = new HeaderFooter();

		writer.setPageEvent(event);

	}

	private static void addTitlePage(Document document)

	throws DocumentException {

		Paragraph preface = new Paragraph();

		// We add one empty line

		addEmptyLine(preface, 1);

		// Lets write a big header

		preface.add(new Paragraph("Expenditure Report", catFont));

		addEmptyLine(preface, 1);

		try {

			addImage(document, preface);

		} catch (MalformedURLException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		} catch (IOException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

		addEmptyLine(preface, 1);

		// Will create: Report generated by: _name, _date

		preface.add(new Paragraph(

				"Report generated by: " + System.getProperty("user.name") + ", " + new Date(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

				smallBold));

		// addEmptyLine(preface, 3);

		// preface.add(new Paragraph(

		// "This document describes something which is very important ",

		// smallBold));

		// addEmptyLine(preface, 8);

		// preface.add(new Paragraph(

		// "This document is a preliminary version and not subject to your license agreement or any other agreement with vogella.de ;-).",

		// redFont));

		document.add(preface);

		// Start a new page

		document.newPage();

	}

	private void addContent(Document document) throws DocumentException {

		Paragraph content = new Paragraph();

		// We add one empty line

		addEmptyLine(content, 1);

		// Add a table

		createTable(content);

		document.add(content);

	}

	private void createTable(Paragraph subCatPart)

	throws BadElementException {

		PdfPTable table = new PdfPTable(4);

		// t.setBorderColor(BaseColor.GRAY);

		// t.setPadding(4);

		// t.setSpacing(4);

		// t.setBorderWidth(1);

		table.setWidthPercentage(100);

		PdfPCell c1 = new PdfPCell(new Phrase("Description"));
		
		c1.setPaddingTop(5);
		
		c1.setPaddingBottom(5);
		
		c1.setUseDescender(true);
		
		c1.setUseAscender(true);

		c1.setHorizontalAlignment(Element.ALIGN_LEFT);

		c1.setVerticalAlignment(Element.ALIGN_MIDDLE);

		c1.setBackgroundColor(new BaseColor(222, 254, 255));

		c1.setBorder(0);

		c1.setBorderWidthTop(1);

		c1.setBorderWidthBottom(1);

		table.addCell(c1);

		c1 = new PdfPCell(new Phrase("Catagory"));		
		
		c1.setPaddingTop(5);
		
		c1.setPaddingBottom(5);
		
		c1.setUseDescender(true);
		
		c1.setUseAscender(true);

		c1.setHorizontalAlignment(Element.ALIGN_LEFT);

		c1.setVerticalAlignment(Element.ALIGN_MIDDLE);

		c1.setBackgroundColor(new BaseColor(222, 254, 255));

		c1.setBorder(0);

		c1.setBorderWidthTop(1);

		c1.setBorderWidthBottom(1);

		table.addCell(c1);

		c1 = new PdfPCell(new Phrase("Cost"));		
		
		c1.setPaddingTop(5);
		
		c1.setPaddingBottom(5);
		
		c1.setUseDescender(true);
		
		c1.setUseAscender(true);

		c1.setHorizontalAlignment(Element.ALIGN_LEFT);

		c1.setVerticalAlignment(Element.ALIGN_MIDDLE);

		c1.setBackgroundColor(new BaseColor(222, 254, 255));

		c1.setBorder(0);

		c1.setBorderWidthTop(1);

		c1.setBorderWidthBottom(1);

		table.addCell(c1);

		c1 = new PdfPCell(new Phrase("Date"));
		
		c1.setPaddingTop(5);
		
		c1.setPaddingBottom(5);

		c1.setUseDescender(true);
		
		c1.setUseAscender(true);
		
		c1.setHorizontalAlignment(Element.ALIGN_LEFT);

		c1.setVerticalAlignment(Element.ALIGN_MIDDLE);

		c1.setBackgroundColor(new BaseColor(222, 254, 255));

		c1.setBorder(0);

		c1.setBorderWidthTop(1);

		c1.setBorderWidthBottom(1);

		table.addCell(c1);

		// table.getDefaultCell().setBackgroundColor(BaseColor.RED);

		// table.getDefaultCell().setBackgroundColor(null);

		table.setHeaderRows(1);
	

		table.getDefaultCell().setBackgroundColor(null);

		boolean alternate = true;

		for (BudgetVO budgetVO : budgetVOs) {

			table.getDefaultCell().setBorder(0);			
			
			table.getDefaultCell().setPaddingTop(5);
			
			table.getDefaultCell().setPaddingBottom(5);
			
			table.getDefaultCell().setUseDescender(true);
			
			table.getDefaultCell().setUseAscender(true);

			table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);

			table.addCell(budgetVO.getTitle());

			table.addCell(budgetVO.getCatagoryVO().getName());

			table.addCell(budgetVO.getCost().toString());

			SimpleDateFormat dt = new SimpleDateFormat("dd-MMM-yyyy");

			table.addCell(dt.format(budgetVO.getDate()));

			if (alternate) {

				table.getDefaultCell().setBackgroundColor(
						new BaseColor(243, 247, 251));

				alternate = false;

			} else {

				table.getDefaultCell().setBackgroundColor(BaseColor.WHITE);

				alternate = true;

			}

		}
		//table.setSpacingAfter(10);
		//table.setSpacingBefore(10);
		table.getDefaultCell().setBorderWidthTop(1);
		table.getDefaultCell().setBorderWidthBottom(1);
		table.getDefaultCell().setPaddingTop(5);		
		table.getDefaultCell().setPaddingBottom(5);
		table.getDefaultCell().setUseDescender(true);
		table.getDefaultCell().setUseAscender(true);
		table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
		table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
		table.getDefaultCell().setBackgroundColor(new BaseColor(222, 254, 255));
		table.addCell("");
		table.addCell("Total");
		table.addCell(Double.toString(getBudgetTotal()));
		table.addCell("");
		table.completeRow();
		//table.setFooterRows(1);
		subCatPart.add(table);

	}

	static String absoluteDiskPath = "";

	private static void addImage(Document document, Paragraph preface)
			throws DocumentException, MalformedURLException, IOException {

		Image imghead = Image.getInstance(absoluteDiskPath);

		// document.getPageSize();

		imghead.scalePercent(100, 100);

		imghead.setAlignment(Image.ALIGN_CENTER);

		// imghead.setAbsolutePosition(35,770);

		// imghead.scaleAbsolute(125, 42);

		Paragraph paragraph = new Paragraph();

		paragraph.setAlignment(paragraph.ALIGN_CENTER);

		paragraph.add(imghead);

		preface.setAlignment(paragraph.ALIGN_CENTER);

		preface.add(paragraph);

	}

	private static void addEmptyLine(Paragraph paragraph, int number) {

		for (int i = 0; i < number; i++) {

			paragraph.add(new Paragraph(" "));

		}

	}

	
	private double getBudgetTotal(){
		double total = 0;
		for (BudgetVO  budgetVO: budgetVOs) {
			total += budgetVO.getCost().doubleValue();
		}
		return total;
	}
}